﻿/*
 * Created by SharpDevelop.
 * User: Emanuel
 * Date: 24-05-2013
 * Time: 09:11
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Linq;

namespace Client
{
	class Program
	{
        /// <summary>
        /// Função resposável por iniciar a sessão
        /// </summary>
        /// <param name="args"></param>
		public static void Main(string[] args)
		{
			Cliente cliente = new Cliente(); //Criar conexão com servidor
			if (!cliente.sessaoFechada) //Se não exister problema de comunicação então fazer login
				Login(cliente);
			
			
		}
		
		/// <summary>
		/// Método para desenhar menu de login
		/// </summary>
		/// <param name="cliente"></param>
		private static void Login(Cliente cliente) {
			ConsoleKeyInfo key;
			string pass="";
			Console.WriteLine("********************");
			Console.WriteLine("****** LOGIN *******");
			Console.WriteLine("********************");
			Console.Write("Digite o seu username: ");
			
			cliente.username = Console.ReadLine();
			Console.Write("\nDigite a sua password: ");
			
			do {
				key = Console.ReadKey(true);
				//Se o utilizador não pressionar enter nem backspace guardar char e mostrar * na consola

				if(key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter && key.KeyChar>48 && key.KeyChar<122)
				{
					pass+=key.KeyChar; //guarda char a char na string pass
					Console.Write("*");
				} else {
					if (key.Key==ConsoleKey.Backspace && pass.Length > 0) {
						pass = pass.Substring(0,(pass.Length-1)); //remover o ultimo char
						Console.Write("\b \b"); //apagar o ultimo *
					}
				}
			} while (key.Key != ConsoleKey.Enter); //Ciclo só interrompe quando o utilizador pressionar enter
			
			cliente.password = Cifra.Cifragem.cifrar(pass,cliente.username); //Cifrar a password
			
			if (cliente.login()) {
				Menu(cliente);
			}
		}
		
		/// <summary>
		/// Método para criar menu de opções (PROGRAMAÇÃO A FAZER: LISTAR LEILOES E ADICIONAR LEILAO)
		/// </summary>
		/// <param name="cliente"></param>
		private static void Menu(Cliente cliente) {
			int selector = 1;
			bool good = false;
			float valor;
			string simNao="n";
			
			while (selector != 0) {
				Console.Clear();
				drawTitle();
				drawMenu();
				good = int.TryParse(Console.ReadLine(),out selector);
				if (good) {
					good = false;
					switch (selector)
					{
						case 1:
							Console.WriteLine("Saldo: {0}",cliente.verSaldo());
							break;
						case 2:
							Console.WriteLine("Listar leilões ativos");
							simNao="n";
							do {
                                cliente.emUso = true;
								listarLeilao(cliente.verAtivos());
								licitarAutomatico(cliente);
								Console.Write("\nDeseja automatizar mais algum leilão? [s/n]: ");
								simNao = Console.ReadLine();
								
							} while(simNao.ToLower().Contains("s"));
							break;
						case 3:
							Console.WriteLine("Listar leilões disponiveis");
							listarLeilao(cliente.verDisponiveis());
							
							selLicitarLeilao(cliente); //Detalha leilao e licitaa
							
							break;
						case 4:
							Console.Clear();
							Console.WriteLine("Criar Leilao");
							Leiloes.Leilao novoLeilao = new Leiloes.Leilao(); // Objeto novo leilao
							bool sucesso=false; //flag se o leiao foi criado com sucesso;
							cliente.emUso = true;
							do {
								Console.Write("Digite o nome do Leilao: ");
								novoLeilao.nome=Console.ReadLine();
								
								Console.Write("Digite a descrição do artigo: ");
								novoLeilao.descricaoArtigo=Console.ReadLine();
								
								Console.Write("Data de inicio do Leila [DD-MM-AAAA]: ");
								novoLeilao.setDataInicio(Console.ReadLine());
								
								Console.Write("Data de fim do Leilao [DD-MM-AAAA]: ");
								novoLeilao.setDataFim(Console.ReadLine());
								
								Console.Write("Digite o valor base do Leilao: ");
								novoLeilao.setValorInicial(Console.ReadLine());
								
								Console.WriteLine("\nLeilao criado:");
								
								novoLeilao.vendedorID = cliente.id;
								
								drawStarLine();
								Console.WriteLine(novoLeilao);
								drawStarLine();
								sucesso = cliente.criarLeilao(novoLeilao);
							} while (!sucesso);
							
							break;
						case 5:
							while (!good)
							{
								Console.Write("Valor a depositar:");
								good = float.TryParse(Console.ReadLine(),out valor);
								if(cliente.depositar(valor)){
									Console.WriteLine("Sucesso");
								}
							}
							
							break;
						default:
							if (selector != 0)
							{
								errorMessage();
							}
							break;
					}
				} else {
					selector=1;
					errorMessage();
				}
				Console.ReadKey();
			}
		}
		
		/// <summary>
		/// Método para listar leiloes ativos ou disponiveis
		/// </summary>
		/// <param name="leiloes"></param>
		private static void listarLeilao(IList<Leiloes.Leilao> leiloes) {
			foreach (var element in leiloes) {
				drawStarLine();
				Console.WriteLine(element.ToString());
				drawStarLine();
			}
		}
		
        /// <summary>
        /// Metodo utilizado para iniciar a licitação automática do cliente
        /// </summary>
        /// <param name="cliente"></param>
		private static void licitarAutomatico(Cliente cliente) {
			int selLeilao=0;
			double valorMax;
			double valorIncr;
			
			Console.Write("Digite o id do leilão que deseja automatizar: ");
			bool good = int.TryParse(Console.ReadLine(),out selLeilao);
			if (good) {
				Leiloes.Leilao leilaoDetalhe = cliente.detalhe(selLeilao);
				if (cliente.listaLicitarAuto.Count>0) {
					Leiloes.Leilao leilaoAtual = ((Leiloes.Leilao)cliente.listaLicitarAuto.Where(i=>i.id==selLeilao).First<Leiloes.Leilao>());
					if (leilaoAtual != null) {
						cliente.listaLicitarAuto.Remove(leilaoAtual);
					}
				}
				Console.Clear();
				drawStarLine();
				do {
					Console.Write("Digite o valor maximo disposto a pagar pelo artigo: ");
					good = double.TryParse(Console.ReadLine(),out valorMax);
					if (cliente.verSaldo()<valorMax) {
						Console.WriteLine("Não tem saldo saldo suficiente");
						return;
					}
					if (good)
						leilaoDetalhe.valorMax = valorMax;
				} while (!good);
				
				do {
					Console.Write("Digite o valor a incrementar a cada licitação: ");
					good = double.TryParse(Console.ReadLine(),out valorIncr);
					leilaoDetalhe.valorIncr = valorIncr;
				} while (!good);
				cliente.listaLicitarAuto.Add(leilaoDetalhe);
			}
		}
		
		/// <summary>
		/// Método responsável por detalhar ao utilizador o leilao selecionado e licitar o leiao
		/// </summary>
		/// <param name="cliente"></param>
		private static void selLicitarLeilao(Cliente cliente) {
			Console.Write("Digite o id do leilão que pretende detalhar: ");
			int selLeilao=0;
			bool good = int.TryParse(Console.ReadLine(),out selLeilao);
			if (good) {
				Leiloes.Leilao leilaoDetalhe = cliente.detalhe(selLeilao);
				Console.Clear();
				drawStarLine();
				Console.WriteLine(leilaoDetalhe.ToString());
				drawStarLine();
				//Se o leilao estiver ativo(1) então pergunta ao utilizador se deseja licitar;
				if (leilaoDetalhe.ativo.Contains("True")) {
					
					Console.Write("\nDeseja licitar? [s/n]: ");
					string simNao = Console.ReadLine();
					if (simNao.ToLower().Contains("s")) {
						double valorMinimoLicitar = leilaoDetalhe.valorInicial;
						if(leilaoDetalhe.valorAtual >0) {
							valorMinimoLicitar = leilaoDetalhe.valorAtual;
						}
						
						double valor;
						do {
							Console.Write("Digite o valor a licitar, > {0}: ",valorMinimoLicitar);
							good = double.TryParse(Console.ReadLine(),out valor);
							if(good) {
								if(valor > valorMinimoLicitar)
									good = false;
							}
						} while(good);
						bool sucesso = cliente.licitar(selLeilao,valor);
						if (sucesso) {
							Console.WriteLine("Leilão: {0} licitado com sucesso",leilaoDetalhe.nome);
						} else {
							Console.WriteLine("Saldo insuficiente para a operação licitar");
						}
					}
				}
			}
		}
		
		/// <summary>
		/// Se o utilizador não respeitar as opções disponiveis é mostrado o seguinde erro
		/// </summary>
		private static void errorMessage()
		{
			Console.WriteLine("Opção errada..., prima qualquer tecla para continuar");
		}

		/// <summary>
		/// Método para desenhar uma linha
		/// </summary>
		private static void drawStarLine()
		{
			Console.WriteLine("************************");
		}

		/// <summary>
		/// Método para desenhar titlo do menu
		/// </summary>
		private static void drawTitle()
		{
			drawStarLine();
			Console.WriteLine("`•.,¸¸,.•´¯ Menu ¯`•.,¸¸,.•´");
			drawStarLine();
		}

		/// <summary>
		/// Método para desenhar menu
		/// </summary>
		private static void drawMenu()
		{
			drawStarLine();
			Console.WriteLine(" 1. Ver saldo");
			Console.WriteLine(" 2. Leilões ativos");
			Console.WriteLine(" 3. Leilões disponiveis");
			Console.WriteLine(" 4. Criar Leilao");
			Console.WriteLine(" 5. Depositar");
			Console.WriteLine(" 0. Sair");
			drawStarLine();
			Console.WriteLine("Digite a opção pretendida: 1, 2,... ou 0 para sair da aplicação");
			drawStarLine();
		}
	}
}